from django.contrib.auth.models import User
from django.db import models

# Create your models here.
# 详情表
from utils.modelsMixin import ModelSetMixin


class UserDetail(models.Model):
    SEX_CHOICES = (  # 常量
        (0, '女'),
        (1, '男')
    )
    avatar = models.TextField(null=True, blank=True, verbose_name='头像')  # null允许为空; blank前端是否需要传入值
    phone = models.CharField(max_length=11, unique=True, null=True, blank=True, verbose_name='电话')
    age = models.SmallIntegerField(null=True, blank=True, verbose_name='年龄')
    sex = models.SmallIntegerField(null=True, blank=True, verbose_name='性别', choices=SEX_CHOICES)  # 枚举
    birthday = models.DateField(null=True, blank=True, verbose_name='生日'),  # 月日

    # 关联user表
    user = models.OneToOneField(User, on_delete=models.CASCADE)  # 用户表与详情表一对一关联, 同步删除
    default = models.ForeignKey('Address', verbose_name='默认收货地址', on_delete=models.SET_NULL, null=True, blank=True)

    # 虽然一个用户对于一个默认收货地址,但是有时候也是可以小小得"叛逆"一下的
    # 不管是函数还是类,对于python来说,一般都是先定义再使用。但在项目里可以稍稍特殊一点。关联对象上加上""变成字符串来占位置。然后在
    # 运行的时候python自然就会再次进行解析(PS:加载的时候Address已经加载出来了)

    class Meta:  # 修改元信息
        db_table = 'detail'
        verbose_name = '用户详情'
        verbose_name_plural = verbose_name  # 防止中文翻译是,因为复数原因出现错误


class Area(models.Model):
    name = models.CharField(max_length=20, verbose_name='名称')
    parent = models.ForeignKey('self', null=True, on_delete=models.SET_NULL, blank=True,
                               verbose_name='上级行政区')  # 上级行政区 on_delete=models.SET_NULL删除为空

    class Meta:
        db_table = 'area'
        verbose_name = '行政区'
        verbose_name_plural = verbose_name

    def __str__(self):  # 前端页面显示指定字符串
        return f'{self.id}-{self.name}'


class Address(ModelSetMixin):  # 因为我的的收货地址涉及到的创建数据、修改数据和逻辑删除以及在Minxin中写好了,所以此时只要调用就好了
    name = models.CharField('地址分类', max_length=50)  # 公司or家or其它？
    province = models.ForeignKey(Area, verbose_name='省', on_delete=models.PROTECT,
                                 related_name='province_address')  # 已写好,直接关联上面的
    city = models.ForeignKey(Area, verbose_name='市', on_delete=models.PROTECT,
                             related_name='city_address')  # 定义好省市区的反向管理器
    district = models.ForeignKey(Area, verbose_name='区/县', on_delete=models.PROTECT, related_name='district_address')
    place = models.CharField('详细地址', max_length=40)
    receiver = models.CharField('收货人', max_length=10)
    phone = models.CharField('联系号码', max_length=11)

    user = models.ForeignKey(User, verbose_name='用户', on_delete=models.CASCADE)  # 用户删除,收货地址自然也就同步删除

    class Meta:
        db_table = 'address'
        ordering = ['-u_time']
        verbose_name = '收货地址'
        verbose_name_plural = verbose_name

    def __str__(self):
        return f'{self.province}-{self.city}-{self.district}'
